
#include <view/Janela.h>
#include <view/Texto.h>
#include <view/Fonte.h>
#include <view/ComboBox.h>


ComboBox::ComboBox(int cx, int cy, int x, int y)
    : Controle(cx, cy, x, y),
      m_aberto(false),
      m_ImgItems(NULL),
      m_ImgItemsAtivos(NULL),
      m_AlturaFechado(Altura())
{
    for(int i=0; i<Largura()-m_AlturaFechado; i++)
        for(int j=0; j<Altura(); j++)
            Matriz()[i][j] = RGBA(255,255,255,255);
    for(int i=Largura()-m_AlturaFechado; i<Largura(); i++)
        for(int j=0; j<Altura(); j++)
            Matriz()[i][j] = RGBA(128,128,128,255);

    for(int i=0; i<Largura(); i++)
    {
        Matriz()[i][0] = RGBA(0,0,0,255);
        Matriz()[i][Altura()-1] = RGBA(0,0,0,255);
    }
    for(int j=0; j<Altura(); j++)
    {
        Matriz()[0][j] = RGBA(0,0,0,255);
        Matriz()[Largura()-1][j] = RGBA(0,0,0,255);
    }
}

ComboBox::~ComboBox()
{
    ;
}

void ComboBox::Fonte(std::string strFonte, int tamanho, int cor)
{
    ;
}

void ComboBox::Reescrever()
{
    ;
}

void ComboBox::CarregarFuncoes(MapaDeFuncoes& mapa)
{
    if(m_ImgItems)
    {
        for(size_t i=0; i<m_MapaDeFuncoes.size(); i++)
            delete m_ImgItems[i];
        free(m_ImgItems);
    }
    if(m_ImgItemsAtivos)
    {
        for(size_t i=0; i<m_MapaDeFuncoes.size(); i++)
            delete m_ImgItemsAtivos[i];
        free(m_ImgItemsAtivos);
    }
    
    m_ImgItems       = (Imagem**) ::malloc( mapa.size()*sizeof(Imagem*) );
    m_ImgItemsAtivos = (Imagem**) ::malloc( mapa.size()*sizeof(Imagem*) );

    m_MapaDeFuncoes = mapa;
    
    int cont = 0;    
    for(MapaDeFuncoes::iterator it=m_MapaDeFuncoes.begin(); it!=m_MapaDeFuncoes.end(); it++)
    {
        m_ImgItems[cont]       = new Imagem(Largura()-2,18);
        m_ImgItemsAtivos[cont] = new Imagem(Largura()-2,18);
        
        Texto texto(it->first, 0, 0);
        texto.Fonte("verdana", 14);

        for(int i=0; i<Largura()-2; i++)
            for(int j=0; j<18; j++)
            {
                m_ImgItems[cont]->Matriz()[i][j] = RGBA(255,255,255,255);
                m_ImgItemsAtivos[cont]->Matriz()[i][j] = RGBA(64,128,255,255);
            }
            
        m_ImgItems[cont]->Matriz().Mesclar(4, 2, texto.Matriz(), 0, 0, Largura()-2, 18);
        m_ImgItemsAtivos[cont]->Matriz().Mesclar(4, 2, texto.Matriz(), 0, 0, Largura()-2, 18);
        
        cont++;
    }
}

bool ComboBox::AoBaixarEsq(EventoBaixarEsq ev)
{
    int altura_antiga = Altura();
    
    if(ev.x>Largura()-m_AlturaFechado && ev.y<18)
    {
        if(!m_aberto)
        {
            Altura((int)m_MapaDeFuncoes.size()*18 + m_AlturaFechado);

            int cont = 0;
            for(MapaDeFuncoes::iterator it=m_MapaDeFuncoes.begin(); it!=m_MapaDeFuncoes.end(); it++)
            {
                Matriz().Mesclar( 1, m_AlturaFechado+18*cont, m_ImgItems[cont]->Matriz(), 0,0,1000,1000 );

                for(int i=0; i<Largura(); i++)
                {
                    Matriz()[i][0] = RGBA(0,0,0,255);
                    Matriz()[i][Altura()-1] = RGBA(0,0,0,255);
                }
                for(int j=0; j<Altura(); j++)
                {
                    Matriz()[0][j] = RGBA(0,0,0,255);
                    Matriz()[Largura()-1][j] = RGBA(0,0,0,255);
                }
                cont++;
            }
            m_aberto = true;
        }
        else
        {
            Altura(m_AlturaFechado);
            m_aberto = false;
        }
        ev.janela->Redesenhar(PosicaoAbsolutaX(), PosicaoAbsolutaY(),
                              PosicaoAbsolutaX()+Largura(), PosicaoAbsolutaY()+max((int)Altura(), (int)altura_antiga));
    }
    
    
    int cont=0;
    for(MapaDeFuncoes::iterator it=m_MapaDeFuncoes.begin(); it!=m_MapaDeFuncoes.end(); it++)
    {
        if(ev.y>=m_AlturaFechado+18*cont && ev.y < m_AlturaFechado+18*(cont+1))
        {
            Altura(m_AlturaFechado);
            m_aberto = false;
            
            MatrizRGBA matriz_temp(Largura()-20, m_AlturaFechado);
            for(int i=0; i<matriz_temp.Largura(); i++)
                for(int j=0; j<matriz_temp.Altura(); j++)
                    matriz_temp[i][j] = m_ImgItems[cont]->Matriz()[i][j+2];
            Matriz().Mesclar( 1, 1, matriz_temp, 0,0,1000,1000 );

            if(it->second)
                it->second();
            break;
        }
            
        cont++;
    }
    
    ev.janela->Redesenhar(PosicaoAbsolutaX(), PosicaoAbsolutaY(),
                          PosicaoAbsolutaX()+Largura(), PosicaoAbsolutaY()+max((int)Altura(), (int)altura_antiga));

	return false;
}

bool ComboBox::AoSubirEsq(EventoSubirEsq ev)
{
    return false;
}

bool ComboBox::AoMoverSobre(EventoMoverSobre ev)
{
    if(m_aberto)
    {
        int cont = 0;
        for(MapaDeFuncoes::iterator it=m_MapaDeFuncoes.begin(); it!=m_MapaDeFuncoes.end(); it++)
        {
            static int flag = 1;
            
            if(flag)
            {
                flag = 0;

                if(ev.y < m_AlturaFechado+18*(cont+1) && ev.y > m_AlturaFechado+18*cont)
                    Matriz().Mesclar(1, m_AlturaFechado+18*cont, m_ImgItemsAtivos[cont]->Matriz(), 0, 0, 100, 100);
                else
                    Matriz().Mesclar(1, m_AlturaFechado+18*cont, m_ImgItems[cont]->Matriz(), 0, 0, 100, 100);


                for(int i=0; i<Largura(); i++)
                {
                    Matriz()[i][0] = RGBA(0,0,0,255);
                    Matriz()[i][Altura()-1] = RGBA(0,0,0,255);
                }
                for(int j=0; j<Altura(); j++)
                {
                    Matriz()[0][j] = RGBA(0,0,0,255);
                   Matriz()[Largura()-1][j] = RGBA(0,0,0,255);
                }

            cont++;

            flag = 1;
            }
        }
        ev.janela->Redesenhar(this);
    }

	return false;
}

